package org.example.myleet.p388;

public class Solution {

    public int lengthLongestPath(String input) {
        //记录文件夹节点深度顺序
        int[] nodes = new int[5000];
        int i = 0, maxPathLen = 0, ni = 0;
        //每个节点的名字，文件夹的或文件的
        int nodeNameLen = 0;
        boolean isFile = false;
        char[] inputCharArr = input.toCharArray();
        while (i < inputCharArr.length || nodeNameLen > 0) {
            //当i超出输入之后，相当于一个换行结束输入，确定一个路径
            char c = i >= inputCharArr.length ? '\n' : inputCharArr[i];
            if (c == '\n') {
                //换行相当于结束一次输入，可以确定一个绝对路径，文件夹的或文件的
                int absolutePathLen = 0;
                //找到当前节点的上一层节点
                int lastNI = ni - 1;
                if (lastNI >= 0) {
                    //如果有上一层节点，则绝对路径为连接上一层节点和本节点名字形成路径
                    absolutePathLen = nodes[lastNI] + 1 + nodeNameLen;
                } else {
                    //没有上一层节点，则绝对路径为本层节点名称
                    absolutePathLen = nodeNameLen;
                }
                if (isFile) {
                    //如果是文件，记录最长的绝对路径
                    maxPathLen = Math.max(maxPathLen, absolutePathLen);
                } else {
                    //如果是文件夹，则缓存到文件夹节点深度顺序中
                    nodes[ni] = absolutePathLen;
                }
                //重置节点深度和节点名称以及是否文件
                ni = 0;
                nodeNameLen = 0;
                isFile = false;
            } else if (c == '\t') {
                //进入下一层文件夹深度
                ++ni;
            } else if (c == '.') {
                //是个文件
                isFile = true;
                ++nodeNameLen;
            } else {
                ++nodeNameLen;
            }
            ++i;
        }
        return maxPathLen;
    }

//    public int lengthLongestPath(String input) {
//        //记录文件夹节点深度顺序
//        String[] nodes = new String[10000];
//        int i = 0, maxPathLen = 0, ni = 0;
//        //每个节点的名字，文件夹的或文件的
//        StringBuilder nodeName = new StringBuilder();
//        boolean isFile = false;
//        char[] inputCharArr = input.toCharArray();
//        while (i < inputCharArr.length || nodeName.length() > 0) {
//            //当i超出输入之后，相当于一个换行结束输入，确定一个路径
//            char c = i >= inputCharArr.length ? '\n' : inputCharArr[i];
//            if (c == '\n') {
//                //换行相当于结束一次输入，可以确定一个绝对路径，文件夹的或文件的
//                StringBuilder absolutePath = new StringBuilder();
//                //找到当前节点的上一层节点
//                int lastNI = ni - 1;
//                if (lastNI >= 0) {
//                    //如果有上一层节点，则绝对路径为连接上一层节点和本节点名字形成路径
//                    absolutePath.append(nodes[lastNI]).append('/').append(nodeName);
//                } else {
//                    //没有上一层节点，则绝对路径为本层节点名称
//                    absolutePath.append(nodeName);
//                }
//                if (isFile) {
//                    //如果是文件，记录最长的绝对路径
//                    maxPathLen = Math.max(maxPathLen, absolutePath.length());
//                } else {
//                    //如果是文件夹，则缓存到文件夹节点深度顺序中
//                    nodes[ni] = absolutePath.toString();
//                }
//                //重置节点深度和节点名称以及是否文件
//                ni = 0;
//                nodeName = new StringBuilder();
//                isFile = false;
//            } else if (c == '\t') {
//                //进入下一层文件夹深度
//                ++ni;
//            } else if (c == '.') {
//                //是个文件
//                isFile = true;
//                nodeName.append(c);
//            } else {
//                nodeName.append(c);
//            }
//            ++i;
//        }
//        return maxPathLen;
//    }
}
